package bean;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;

import bean.vo.ItemOrdenCompraVO;

@Entity 
@Table( name = "items_orden_de_compra" )
public class ItemOrdenCompra extends EntidadPersistente{
	@ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH} )
	@Cascade( org.hibernate.annotations.CascadeType.SAVE_UPDATE)
	private Producto producto;
	private Integer cantidadPedida;
	@OneToMany (cascade = CascadeType.ALL, mappedBy = "itemOrdenCompra")
	private List<ProductoRecibido> productosRecibidos;
	@ManyToOne
	private OrdenCompra ordenCompra;
	
	public ItemOrdenCompra () {
		this.productosRecibidos = new ArrayList<ProductoRecibido>();
	}
	
	public ItemOrdenCompra (OrdenCompra ordenCompra, Producto producto, Integer cantidadPedida) {
		this.ordenCompra = ordenCompra;
		this.producto = producto;
		this.cantidadPedida = cantidadPedida;
		this.productosRecibidos = new ArrayList<ProductoRecibido>();
	}
	
	public ItemOrdenCompraVO getVO() {
		ItemOrdenCompraVO vo = new ItemOrdenCompraVO();
		vo.setCantidadPedida(cantidadPedida);
		vo.setProducto(producto != null ? producto.getVO() : null);
		
		return vo;
	}
	
	public Producto getProducto() {
		return producto;
	}
	
	public void setProducto(Producto producto) {
		this.producto = producto;
	}
	
	public Integer getCantidadPedida() {
		return cantidadPedida;
	}
	
	public Integer getCantidadRecibida() {
		int val = 0;
		
		for (ProductoRecibido prod : productosRecibidos) {
			val += prod.getCantidadRecibida();
		}
		
		return val;
	}
	
	public void setCantidadPedida(Integer cantidadPedida) {
		this.cantidadPedida = cantidadPedida;
	}
	
	public List<ProductoRecibido> getProductosRecibidos() {
		return productosRecibidos;
	}
	
	public void setProductosRecibidos(List<ProductoRecibido> productosRecibidos) {
		this.productosRecibidos = productosRecibidos;
	}

	public OrdenCompra getOrdenCompra() {
		return ordenCompra;
	}

	public void setOrdenCompra(OrdenCompra ordenCompra) {
		this.ordenCompra = ordenCompra;
	}
	
	public int agregarProductoRecibido(RemitoProveedor remito, int cantidadMaxima) {
		
		int totalRecibido = this.getCantidadRecibida(); 
		
		int cantidadAgregar = Math.min(cantidadMaxima, cantidadPedida - totalRecibido);
		
		if(cantidadAgregar > 0) {
			ProductoRecibido prod = new ProductoRecibido(this, cantidadAgregar, remito);
			this.productosRecibidos.add(prod);
		}
		
		return cantidadAgregar;
	}
	
	@Override
	public int hashCode() {
		final int primo = 31;
		int result = 1;
		result = primo * (result + (producto == null ? 0 : producto.hashCode()) + (ordenCompra == null ? 0 : ordenCompra.hashCode()));
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj) return true;	
		if ((obj == null) || (!(obj instanceof ItemOrdenCompra))) {
			return false;
		}
		
		ItemOrdenCompra otro = (ItemOrdenCompra) obj;
		
		boolean mismoProducto = (producto!=null && otro.producto != null ? (producto.equals(otro.producto)) : false);
		boolean mismaOrden = (ordenCompra!=null && otro.ordenCompra != null ? (ordenCompra.equals(otro.ordenCompra)) : false);
		
		return mismoProducto && mismaOrden;
	}
}
